var express = require('express'),
    // superagent = require('superagent'),
    session = require('express-session'),
    glob = require('glob'),
    favicon = require('serve-favicon'),
    morgan = require('morgan'),
    cookieParser = require('cookie-parser'),
    bodyParser = require('body-parser'),
    multer = require('multer'),
    compress = require('compression'),
    methodOverride = require('method-override'),
    swig = require('swig-templates');
    // basicAuth = require("basic-auth");
    // common = require('../app/controllers/base/common.js');

// swig.setFilter('dump', function (input) {
//     return console.log(input);
// });
swig.setDefaults({cache: 'memory'});

/*
var auth = function (req, resp, next) {
    function unauthorized(res) {
        res.set('WWW-Authenticate', 'Basic realm=Authorization Required');
        return resp.sendStatus(401);
    }

    var user = basicAuth(req);

    if (!user || !user.name || !user.pass) {
        return unauthorized(resp);
    }

    if (user.name === 'leisutiyu' && user.pass === 'leisutiyu666') {
        return next();
    } else {
        return unauthorized(resp);
    }
};
*/

module.exports = function (app) {
    // var env = process.env.NODE_ENV || 'development';
    // app.locals.ENV = env;
    // app.locals.ENV_DEVELOPMENT = env == 'development';

    // app.locals.kakarotto = kakarotto;
    app.locals.apiOrigin = kakarotto.config.api.origin;

    app.engine('html', swig.renderFile);

    // if (kakarotto.config.app.isDev) {
        app.set('view cache', false);
        swig.setDefaults({cache: false});
    // }
    
    // 终端中打印请求日志
    app.use(morgan('dev'));
    // app.set('trust proxy', 1); // trust first proxy

    // app.set('views', kakarotto.config.app.ROOT_PATH + '/pages/views');
    app.set('views', kakarotto.config.app.APP_PATH + '/views');
    app.set('view engine', 'html');


    // 希望 .js 结尾的都使用这个中间件；
    // app.use(/js$/, function (req, res, next) {// 不行；
    // app.use(/js\/.*\.js$/, function (req, res, next) {
    // app.use(/js\/base\/.*\.js$/, function (req, res, next) {
    

    // ============================================================

    // 直接使用 asset 下的 js 文件；
    // app.use(/\.js$/, function (req, res, next) {// 这个倒是可以的；
    // app.use('/js', function (req, res, next) {
    //     console.log('/js\/.*\.js$/');
    //     next();
    // });
    
    // app.use(/\.js$/, express.static(kakarotto.config.app.ASSET_PATH, {
    // app.use(/\/.*\.js$/, express.static(kakarotto.config.app.ASSET_PATH, {
    // app.use('/js', express.static(kakarotto.config.app.ASSET_PATH, {
    
    // 这是才是成功的，也就是说，类似nginx 中请求转发那样，path 部分被去掉了，剩下的才会到指定名录中找文件；
    // 比如 pathname: '/js/base/lib/eruda.js.map', 去除指定的path 部分：'/js'，
    // 剩下的 /base/lib/eruda.js.map，然后拼接到 static 的第一个参数后面找文件。
    app.use('/js', express.static('D:/project/study/express/diy/asset/js', {
        maxAge: 0
    }));
    
    // 这样的话，使用扩展名的方式来指定文件位置，就需要额外工作了，因为匹配后，整个path 剩下的是空字符串，到指定目录下找肯定找不到的。
    // 即使想做额外工作，目前也是没有思路~~
    
    // ============================================================
    

    // 放在中间件列表中第一个比较合理；
    app.use(favicon(kakarotto.config.app.PUBLIC_PATH + '/favicon.ico'));

    // app.use(compress());
    
    // 静态资源（因为没有第一个 path，所以把整个 path 放在拼接到指定目录下找，当然找的到。）
    // app.use(express.static(kakarotto.config.app.PUBLIC_PATH, {
    app.use('/font', express.static(kakarotto.config.app.PUBLIC_PATH + '/font', {
        // maxAge: kakarotto.config.option.maxAge
        maxAge: 0
    }));
    app.use('/css', express.static(kakarotto.config.app.PUBLIC_PATH + '/css', {
        // maxAge: kakarotto.config.option.maxAge
        maxAge: 0
    }));
    app.use('/image', express.static(kakarotto.config.app.PUBLIC_PATH + '/image', {
        // maxAge: kakarotto.config.option.maxAge
        maxAge: 0
    }));
    app.use('/component', express.static(kakarotto.config.app.PUBLIC_PATH + '/component', {
        // maxAge: kakarotto.config.option.maxAge
        maxAge: 0
    }));

    app.use(session({
        secret: kakarotto.config.option.sessionSecret,

        // express-session deprecated undefined resave option; provide resave option config\express.js:58:13
        // express-session deprecated undefined saveUninitialized option; provide saveUninitialized option config\express.js:58:13
        // 所以应该启用它们；
        resave: true,
        saveUninitialized: true,

        cookie: {
            maxAge: kakarotto.config.option.cookieExpiresIn
        }
    }));

    // parse application/json
    // app.use(bodyParser.json());
    // parse application/x-www-form-urlencoded
    app.use(bodyParser.urlencoded({
        extended: true
    }));
    // parse multipart/form-data
    // app.use(multer());

    app.use(cookieParser());
    
    app.use(methodOverride());

    // app.use(function (req, res) {
    //     res.setHeader('Content-Type', 'text/plain')
    //     res.write('you posted:\n')
    //     res.end(JSON.stringify(req.body, null, 2))
    // });
    
    if (process.env.test_cookie) {
        app.use(function(req, res, next) {
            req.cookies.user_id = 1;
            next();
        });
    }

    // var controllers = glob.sync(kakarotto.config.app.APP_PATH + '/controllers/*.js');
    // controllers.forEach(function (controller) {
    //     require(controller)(app);
    // });
    require(kakarotto.config.app.APP_PATH + '/controllers/home')(app);

    app.use(function (req, res, next) {
        kakarotto.logger.loog('express 1');
        var err = new Error('Error Page');
        err.status = 404;
        next(err);
    });


    // basic auth
    // app.get('*', auth, function (req, resp, next) {
    //     next()
    // });

    app.use(function (err, req, res, next) {
        kakarotto.logger.loog('express 2');
        kakarotto.logger.loog(err);
        res.status(err.status || 500);
        res.render('error', {
            message: err.message,
            error: kakarotto.config.app.isDevelopment ? err : {},
            title: '错误'
        });
        // res.write(err)
    });
};
